package day11;
import java.util.Objects;
//测试 Object工具类
//总结 :
//1, 什么时候要重写Object提供的toString()
        //--想要查看属性值而不是地址值时
//2, 什么时候要重写Object提供的equals()
        //--想要比较对象间的属性值而不是地址值时
public class Test1_Object {
    public static void main(String[] args) {
        //TODO sout 自动补齐打印的
        //测试方式 : ctrl shift f10 / 右键直接run
        Student s = new Student("渣渣辉",20);
        Student s2 = new Student("渣渣辉",20);

//2.1, 现在的比较s和s2不相等 ? -- 默认使用了Object的equals()
//2.2, Object的equals()默认使用了==比较两个引用类型存着的地址值
//==比较基本类型时,比值本身...比引用类型时,比地址值
//2.3, 想让equals()比较时不比地址值,而是 比属性值 -- 重写equals()
// 如果属性都一样,就让equals()相等,结果返回true
        System.out.println( s.equals(s2)  );//false

        System.out.println( s );
        //1.3, 现在展示的是地址值 -> 想 查看属性的值
        //1.4, 默认调用了Object的toString() -> 展示地址值:cn.tedu.api.Student@28d93b30
        //1.5, 想改就,继承Object重写toString() -> 展示属性值: Student{name='渣渣辉', age=20}
    }
}
class Student {
    //TODO generate...constructor--按着ctrl多选
    public Student() {  }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    String name ;
    int age ;
    //1.1, 如果想要看对象的属性值就重写toString(),如果想看对象的地址值不用重写
    //1.2, 右键generate...--toString()--ok
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
//2.4, 默认使用了Object提供的equals()是比较两个对象间的地址值而不是属性值
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
//统一类型,也是学生类型才参与比较--向下转型/向下造型--可以使用子类的特有功能
        Student student = (Student) o;
 //只要name属性一样,age属性也一样就返回true,表示两个对象是相同相等的
        return age == student.age &&
                Objects.equals(name, student.name);
    }

}

